// 基础URL配置
const BASE_URL = 'http://121.43.27.70:5000/api/v1'

// 发送请求的核心方法
const send = (config) => {
  return new Promise((resolve, reject) => {
    // 请求拦截器逻辑
    const token = uni.getStorageSync('token')
    config.header = {
      'Content-Type': 'application/json',
      ...config.header
    }
    
    if (token) {
      config.header.Authorization = `Bearer ${token}`
    }
    
    // 打印请求前的详细信息
    console.log('=== 开始发送请求 ===');
    console.log('请求URL:', config.url);
    console.log('请求方法:', config.method);
    console.log('请求头信息:', config.header);
    console.log('请求数据:', config.data);
    console.log('请求参数:', config.params);

    // 处理URL和参数
    let requestUrl = BASE_URL + config.url
    
    // 如果是GET请求，手动拼接参数
    if (config.method === 'GET' && config.params) {
      const queryParams = []
      for (const key in config.params) {
        queryParams.push(`${key}=${encodeURIComponent(config.params[key])}`)
      }
      if (queryParams.length > 0) {
        requestUrl += (requestUrl.includes('?') ? '&' : '?') + queryParams.join('&')
      }
    }

    // 发送请求
    uni.request({
      url: requestUrl,
      method: config.method,
      data: config.data || (config.method === 'GET' ? undefined : {}),
      header: config.header,
      timeout: 5000,
      success: (response) => {
        // 打印完整响应信息
        console.log('=== 请求响应信息 ===');
        console.log('HTTP状态码:', response.statusCode);
        console.log('响应头:', response.header);
        console.log('响应数据:', response.data);
        
        // 响应拦截器逻辑
        const res = response.data
        if (res.code !== 200) {
          // 根据错误码进行相应处理
          switch (res.code) {
            case 401:
              // token过期或未登录
              uni.showToast({
                title: '登录已过期，请重新登录',
                icon: 'none'
              })
              // 清除本地存储的token
              uni.removeStorageSync('token')
              // 跳转到登录页面
              uni.redirectTo({
                url: '/pages/login/login'
              })
              break
            case 403:
              uni.showToast({
                title: '权限不足',
                icon: 'none'
              })
              break
            case 404:
              uni.showToast({
                title: '请求资源不存在',
                icon: 'none'
              })
              break
            case 500:
              uni.showToast({
                title: '服务器错误',
                icon: 'none'
              })
              break
            default:
              uni.showToast({
                title: res.msg || '请求失败',
                icon: 'none'
              })
          }
          reject(res)
        } else {
          resolve(res)
        }
      },
      fail: (error) => {
        // 打印错误详情
        console.error('=== 请求失败详情 ===');
        console.error('错误信息:', error);
        
        // 处理网络错误等
        uni.showToast({
          title: '网络错误，请检查网络连接',
          icon: 'none'
        })
        reject(error)
      }
    })
  })
}

// 封装GET请求
export const get = (url, params = {}) => {
  return send({
    method: 'GET',
    url,
    params
  })
}

// 封装POST请求
export const post = (url, data = {}) => {
  return send({
    method: 'POST',
    url,
    data
  })
}

// 封装PUT请求
export const put = (url, data = {}) => {
  return send({
    method: 'PUT',
    url,
    data
  })
}

// 封装DELETE请求
export const del = (url) => {
  return send({
    method: 'DELETE',
    url
  })
}

// 文件上传
export const upload = (url, formData) => {
  return new Promise((resolve, reject) => {
    const token = uni.getStorageSync('token')
    const header = {
      'Content-Type': 'multipart/form-data'
    }
    
    if (token) {
      header.Authorization = `Bearer ${token}`
    }
    
    uni.uploadFile({
      url: BASE_URL + url,
      filePath: formData.filePath,
      name: formData.name || 'file',
      formData: formData.formData || {},
      header: header,
      success: (uploadFileRes) => {
        try {
          const res = JSON.parse(uploadFileRes.data)
          if (res.code !== 200) {
            // 统一错误处理
            uni.showToast({
              title: res.msg || '上传失败',
              icon: 'none'
            })
            reject(res)
          } else {
            resolve(res)
          }
        } catch (e) {
          uni.showToast({
            title: '上传失败，返回数据格式错误',
            icon: 'none'
          })
          reject(new Error('数据解析失败'))
        }
      },
      fail: (error) => {
        uni.showToast({
          title: '上传失败，请检查网络连接',
          icon: 'none'
        })
        reject(error)
      }
    })
  })
}

// 创建统一的request对象
export default {
  get,
  post,
  put,
  delete: del,
  upload
}